package com.neusoft.nep.entity;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ComboBox;

import java.util.HashMap;
import java.util.Map;

/**
 * ComboBoxUpdater 类用于动态更新省、市下拉框的内容。
 * 它模拟了省、市的数据，并提供了方法来根据选择的省更新相应的市下拉框。
 */
public class ComboBoxUpdater {

    private ComboBox<String> provinceComboBox = new ComboBox<>(); // 省下拉框
    private ComboBox<String> cityComboBox = new ComboBox<>();    // 市下拉框

    // 省到市的映射，键为省名，值为该省包含的市列表（ObservableList类型，便于JavaFX观察变化）
    private Map<String, ObservableList<String>> provinceToCities = new HashMap<>();

    /**
     * 构造函数，用于初始化省、市数据，并设置下拉框的基本属性和事件监听器。
     */
    public ComboBoxUpdater() {
        // 初始化省、市数据
        initRegionData();

        // 为省下拉框设置数据源为provinceToCities的键集合（即所有省名），并转换为ObservableList以便JavaFX观察变化
        provinceComboBox.setItems(FXCollections.observableArrayList(provinceToCities.keySet()));

        // 为省下拉框添加事件监听器，当省发生变化时更新市下拉框的内容
        provinceComboBox.setOnAction(e -> updateCities());
    }

    /**
     * 初始化省、市的数据。在实际应用中，这些数据通常从数据库或API获取。
     * 这里使用模拟数据进行演示。
     */
    private void initRegionData() {
        // 初始化省到市的映射关系
        provinceToCities.put("北京", FXCollections.observableArrayList("北京市"));
        provinceToCities.put("上海", FXCollections.observableArrayList("上海市"));
        provinceToCities.put("广东", FXCollections.observableArrayList("广州", "深圳", "佛山"));
        provinceToCities.put("江苏", FXCollections.observableArrayList("南京", "苏州", "无锡"));
        provinceToCities.put("浙江", FXCollections.observableArrayList("杭州", "宁波", "温州"));
        provinceToCities.put("辽宁", FXCollections.observableArrayList("沈阳", "大连"));
        provinceToCities.put("吉林", FXCollections.observableArrayList("长春"));
        provinceToCities.put("黑龙江", FXCollections.observableArrayList("哈尔滨"));
    }

    /**
     * 根据选择的省更新市下拉框的内容。
     */
    private void updateCities() {
        String selectedProvince = provinceComboBox.getValue(); // 获取当前选择的省
        if (selectedProvince != null && provinceToCities.containsKey(selectedProvince)) {
            // 为市下拉框设置对应省的市列表
            cityComboBox.setItems(provinceToCities.get(selectedProvince));
            if (!cityComboBox.getItems().isEmpty()) {
                // 默认选中第一个市
                cityComboBox.setValue(cityComboBox.getItems().get(0));
            }
        }
    }

    // 提供获取各个下拉框的公共方法，方便外部访问和使用
    public ComboBox<String> getProvinceComboBox() {
        return provinceComboBox;
    }

    public ComboBox<String> getCityComboBox() {
        return cityComboBox;
    }

    // 提供访问省到市映射关系的公共方法，便于外部获取数据关系
    public Map<String, ObservableList<String>> getProvinceToCities() {
        return provinceToCities;
    }
}
